
<!Doctype html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=utf-8">
<Meta http-equiv="Content-language" Content="zh-CN">
        <title>A Wireless Order Dishes App based on Android-桂林电子科技大学——论文答辩演示稿</title>
        <style>
                body { 
                        background: #444; 
                        color: #FFF;
			font-family: Helvetica, Arial, sans-serif;
                }
		h1 { 
			font-size:1.5em;
padding-left: 55px;
min-height:37px;
		}
		a {
			color: cyan;
		}
                .page {
                        width: 960px;
                        background: #000;
                        border-radius: 20px;
                        padding: 20px;
                        margin: 100px auto;
					box-shadow: 0 0 20px #222;
                }
                .page{margin-top:360px;}
               div.firstpage{margin-top:10px;}
                .cta{
                     width: 940px;
                      background: #000;
                      border-radius: 20px;
                      padding: 20px;
                      margin: auto auto;
					box-shadow: 0 0 20px #222;
                }
                .intro_list{font-size:2em;margin-left:5em;width:20em;}
                .teacher{border-bottom:1px solid #ccc;}
                .page p{font-size:x-large;line-height:20pt;}
                .page ul{font-size:2em;}
                .page .key_list{margin-left:36px;width:25em;}
                .more{background:url(img/ic_more.png) no-repeat;width:1em;border:none;}
                .details{display:none;}
                img.app_img{}
        </style>
 <script src="jquery/jquery-1.7.2.min.js"></script>

        <script>
        jQuery(function($) {
     
        	  
        	  $(".more").toggle(
        			  function(){
		        		  $(this).siblings(".details").slideDown();
		        	  },
		        	  function(){
		        		  $(this).siblings(".details").slideUp();
		        	  })
        	});
        </script>
</head>
<body>
	<section class="page firstpage">
	    <div class="cta">
			<h1><span class="quote">About me</span></h1>
			<ul class="intro_list">
				<li><strong>姓名：</strong>李海珍</li>
				<li><strong>学号：</strong>0800350211</li>
				<li><strong>课题：</strong>基于Android平台的无线点菜系统</li>
				<li class="teacher"><strong>指导老师：</strong>王虎寅</li>
			</ul>
        </div>
	</section>
	<section class="page">
	    <div class="cta">
			<h1>Why need this App</h1>
			<ul>
				<li><strong>73.99%</strong>
					<button class="more">&nbsp;&nbsp;</button>
					<p class="details">在移动智能操作系统中，在国外市场中，2012年5月15日凤凰科技报道，在澳大利亚、英国、法国、德国、意大利、西班牙和美国等七个主要市场，
					Android的市场份额在截至4月中旬的12个星期里增长强劲。在西班牙和意大利。
					Android的市场份额同比增长了一倍多，分别达到72%和49%；在德国，这款操作系统的市场份额也增长了近一倍，达到62%。
					</p>
				</li>
				<li><strong>设计出众，开放，可移植性，支持设备众多</strong></li>
				<li><strong>全球：市场份额第一</strong>
				<button class="more">&nbsp;&nbsp;</button>
					<p class="details">Android系统能够成为市场份额第一的智能移动操作系统，与其出色的系统性能，开放性，移植性，支持设备众多分不开。
                   以往的各种嵌入式设备应用，都在向Android平台转移。本文就是在这一背景下出现的。
                   在Android之前一些餐厅就有使用无线PDA占菜系统。这些系统很多是基于Windows CE系统，而这个系统现在已经被它的开发商微软放弃。
                   所以，我们决定开发基于Android平台的无线点菜系统。Android本身的无线通信能力比其它以往设备更出色。基于Android平台的更多应用也将出现。
                  将应用向android平台移植是大势所趋。
					</p>
				</li>
				<li><strong>向前的历史车轮</strong></li>
				<li><strong>Java</strong></li>
			</ul>

        </div>
	</section>
	<section class="page">
	        <div class="cta">
		<h1>Know About Android.</h1>
		<ul class="key_list">
			<li><strong>What is Android </strong>
			<button class="more">&nbsp;&nbsp;</button>
					<p class="details">
					Android（读音：['ændrɔid]）是一个以Linux为基础的半开源操作系统，主要用于行动设备，由Google和开放手持设备联盟开发与领导。
Android 系统最初由安迪·鲁宾（Andy Rubin）制作，最初主要支持手机。2005年8月17日被Google收购。
2007年11月5日，Google与84家硬件制造商、软件开发商及电信营运商组成开放手持设备联盟（Open Handset Alliance）来共同研发改良Android系统并生产搭载Android的智慧型手机，
并逐渐拓展到平板电脑及其他领域上。随后，Google以Apache免费开源许可证的授权方式，发布了Android的源代码。
        同时，一个负责进一步发展和维护Android操作系统的Android开源项目也被建立（AOSP）。
					</p>
			</li>
			<li><strong>Features </strong>
					<button class="more">&nbsp;&nbsp;</button>
					
							<ul class="details">
							<li><strong>应用框架</strong> 重用及可替换的组件。</li>
							<li><strong>Dalvik虚拟机</strong> 针对手机优化</li>
							<li><strong>集成浏览器</strong> 基于开源的webkit引擎</li>
							<li><strong>优化的图形库</strong> 支持2D图形库，基于OpenGL ES
								的3D图形库。（可选的硬件加速)</li>
							<li><strong>SQLite嵌入式关系型数据库</strong> 支持结构化数据存储</li>
							<li><strong>多媒体支持</strong> 常用的音频，视频，和静态图像格式(MPEG4,
								H.264, MP3, AAC, AMR, JPG, PNG, GIF)</li>
							<li><strong>GSM</strong> (由硬件决定)</li>
							<li><strong>蓝牙, EDGE, 3G,及 WiFi,相机, GPS, 罗盘,重力感应</strong> 取决于硬件)</li>
							<li><strong>强大的集成开发环境</strong>包含设备模拟器(emulator),调试工具，内存及性能分析工具，Eclipse IDE插件。</li>
						</ul>
			</li>
			<li><strong>App </strong>
								<button class="more">&nbsp;&nbsp;</button>
					<p class="details">
						android系统自带了一系统核心应用，包含email客户端，SMS客户端，日历，浏览器，联系人等其它。所以程序都使用Java语言写的。
						同时，简化组件重用，包含一个服务及系统集合。
							丰富可扩展的Views（视图）集合;
							Content Providers用于在应用间共享数据;
							通知管理器(Notification Manager)在状态条中显示自定义的通知警告;
							活动管理器(Activity Manager)管理应用的生命周期，并提供一个通用的后退导航栈。
					</p>
			</li>
			<li><strong>Android Runtime </strong>
									<button class="more">&nbsp;&nbsp;</button>
					<p class="details">
							android提供了Java编程语言使用的基本核心库，每一个android应用都在自己的进程中运行，并且有它自己的Dalvik虚拟机实例。
							Dalvik设计使得能够高效运行多个虚拟机。.dex文件，优化成最小化内存使用。虚拟机是基于寄存器的。由Java类文件用"dx"工具转换而来。
							Dalvik虚拟机依赖于Linux内核来处理于线程和低内存管理。
					</p>
			</li>
			<li><strong>Linux Kernel</strong>
				<button class="more">&nbsp;&nbsp;</button>
					<p class="details">
							Android基于Linux版本2.6（android4开始基于3.x，后缀android版本内核版本可能更新）的内核
							来处理如系统服务，安全管理，内内在管理，进程管理，网络栈，驱动模型。内核同样是在硬件与软件栈之间的抽象层！
					</p>
			</li>
			<li><strong>One App,One User</strong>
				<button class="more">&nbsp;&nbsp;</button>
					<ul class="details">
						
							<li>linux 每一个程序以不用的用户运行</li>
							<li>系统为每一个程序设置一个唯一的ID,此ID对程序不可见。系统为应用程序设置权限，拥有ID的的应用才能访问相应文件。</li>
							<li>每一个进程都有自己的虚拟机。</li>
							<li>默认下每一个应用都在它自己的linux进程中运行。程序某部件需要执行时Android启动此进程，如果以进程不在需要或者系统需要回收内存时，此系统将关闭。</li>
							<li>android系统,应用，符合"最小权限原则",</li>
							<li>
							android中的应用可以通过下面的 方式在应用程序地共享数据或者访问系统服务。 1.可以让两个应用共享同一个LINUX
						用户ID。这可以让应用运行在同一个linux进程及虚拟机当中。注意这需要应用有相同的证书。 2.
						在安装时经过用户的许可。应用可以访问设备的数据，如通讯录，SMS信息。可挂载存在设置（sd卡),相机，蓝牙等等。
							</li>
						</ul>
			</li>
		
		</ul>
		
					<button class="more">&nbsp;&nbsp;</button>
					<p class="details">
					</p>

		</div>
		<div>
			<strong>Android四在应用组件</strong><span class="more" style="height:1em;" >&nbsp;&nbsp;&nbsp;</span>
				<ul class="details">
							<li>
							<strong>活动（Activities)</strong>
							一个活动－一个单独与用户交互的屏幕单位。
								如果程序允许，一个程序的活动可以被另一个程序启A动。
								作为android.app.Activity的子类来实现
						</li>
						<li>
							<strong>服务 （Services)</strong>
								服务是在后台执行以便执行一些长时间运行的操作或者为远程线程操作。一个服务并不提供一个用户界面。
								一个服务可以绑定一个活动来实现某些用户交互。
						</li>
						<li>
							<strong>
								内容提供者（Content providers)
								</strong>
								内容提供者管理应用程序共享的数据，可以为应用选择地将数据存在在文件系统中，或者SQLite数据库中，
								互联网或者其它存储地方。通过内容提供都其它应用可以查询或者修改这些数据（如果内容提供都允许。）
									（例如Android系统提供了一个内容提供者来管理用户联系人信息。ContactsContract.Data）
						</li>
						<li>
							<strong>广播接收者(Broadcast receviers)</strong>
							广播接收者来处理系统范围内的广播（如电量过低，屏幕过低。应用程序也能够发起广播。
							虽然他们不显示用户界面，当有广播时他们也会创建一个状态通知条来提醒用户。
							如，也许可以发起一个服务来跟发生的事件来执行某些动作。作为android.content.BroadcastRecevier的子类
						</li>
							
						</ul>
		 </div>
	</section>
	<section class="page">
	        <div class="cta">
		<h1>Gallery</h1>

		<img class="app_img" src="appimg/start.png" />
		<img class="app_img" src="appimg/connect_server.png" />
		<img class="app_img" src="appimg/login.png" />
		<img class="app_img" src="appimg/settings_new.png" />
		<img class="app_img" src="appimg/loading_menu_data.png" />
		<img class="app_img" src="appimg/loading_floor_data.png" />
		<img class="app_img" src="appimg/floor.png" />
		<img class="app_img" src="appimg/station.png" />
		<img class="app_img" src="appimg/edit.png" />
		<img class="app_img" src="appimg/modify_sauce.png" />
		<img class="app_img" src="appimg/toast_tips.png" />
        </div>
	</section>
	<section class="page">
	        <div class="cta">
		<h1>Design</h1>
			<ul>
				<li><strong>WLAN&Wi-Fi</strong>
			 	 <button class="more">&nbsp;&nbsp;</button>
					<div class="details">
					
					<p>
					无线局域网第一个版本发表于1997年，其中定义了介质访问接入控制层（MAC层）和物理层。物理层定义了工作在2.4GHz的ISM频段上的两种无线调频方式和一种红外传输的方式，总数据传输速率设计为2Mbit/s。两个设备之间的通信可以自由直接(ad
							hoc)的方式进行，也可以在基站(Base Station, BS)或者访问点（Access Point，AP）的协调下进行。
					</p>
					
					<p>Wi-Fi的设置至少需要一个Access
								Point（ap）和一个或一个以上的client（hi）。AP每100ms将SSID（Service Set
								Identifier）经由beacons（信号台）封包广播一次，beacons封包的传输速率是1
								Mbit/s，并且长度相当的短，所以这个广播动作对网络效能的影响不大。因为Wi-Fi规定的最低传输速率是1
								Mbit/s，所以确保所有的Wi-Fi
								client端都能收到这个SSID广播封包，client可以借此决定是否要和这一个SSID的AP连线。使用者可以设定要连线到哪一个SSID。
								Wi-Fi系统总是对用户端开放其连接标准，并支援漫游，这就是Wi-Fi的好处。但亦意味着，一个无线适配器有可能在性能上优于其他的适配器。
					由于Wi-Fi通过空气传送信号，所以和非交换以太网有相同的特点。
					</p>
					<p>一般无线路由产生的信号覆盖范围大概是室内50平方米，室外140平方米</p>
					 Advantages&Disadvantages<button class="more">&nbsp;&nbsp;</button>
					<div class="details">
												优点如下：
						<ol>
							<li>灵活性和移动性。无线局域网在无线信号覆盖区域内的任何一个位置都可以接入网络。</li>
							<li>安装便捷，易于进行网络规划和调整。无线局域网可以免去或最大程度地减少网络布线的工作量，一般只要安装一个或多个接入点设备，就可建立覆盖整个区域的局域网络。</li>
							<li>故障定位容易。无线网络容易定位故障，只需更换故障设备即可恢复网络连接。</li>
							<li>易于扩展。无线局域网有多种配置方式，可以很快从只有几个用户的小型局域网扩展到上千用户的大型网络，并且能够提供节点间“漫游”等有线网络无法实现的特性。</li>
						</ol>
						不足：
						<ol>
							<li>性能。无线局域网是依靠无线电波进行传输的。这些电波通过无线发射装置进行发射，而建筑物、车辆、树木和其它障碍物都可能阻碍电磁波的传输，所以会影响网络的性能。</li>
							<li>速率。无线信道的传输速率与有线信道相比要低得多。目前，无线局域网的最大传输速率为150Mbit/s，只适合于个人终端和小规模网络应用。</li>
							<li>安全性。本质上无线电波不要求建立物理的连接通道，无线信号是发散的。从理论上讲，很容易监听到无线电波广播范围内的任何信号，造成通信信息泄漏。</li>

						</ol>
					</div>
					</div>
			  </li>
			 <li><strong>MVC</strong>
			 	 <button class="more">&nbsp;&nbsp;</button>
					<p class="details">
										现代应用程序的设计基本都遵循MVC框架来设计。
				MVC模式（三层架构模式）（Model-View-Controller）是软件工程中的一种软件架构模式，把软件系统分为三个基本部分：模型（Model）、视图（View）和控制器（Controller）。
MVC模式最早由Trygve Reenskaug在1974年提出，是施乐帕罗奥多研究中心（Xerox PARC）在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式。
MVC模式的目的是实现一种动态的程式设计，使后续对程序的修改和扩展简化，并且使程序某一部分的重复利用成为可能。
除此之外，此模式通过对复杂度的简化，使程序结构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。
					</p>
			 </li>
			 <li><strong>MVC风格的应用框架:M-数据模型层</strong>
			 	 <button class="more">&nbsp;&nbsp;</button>
					<p class="details">
					SQlite,XML,file,network
					</p>
			 </li>
			 <li><strong>MVC风格的应用框架:V-视图界面打造现代自然的用户界面</strong>
			 	 <button class="more">&nbsp;&nbsp;</button>
					<ul class="details">
						<li>Android&nbsp;UI系统</li>
						<li>Android UI部件及事件</li>
						<li>
								<strong>Android事件触发顺序</strong><br/>
						对于应用来说，首先接收到事件的是Activity类的Activity:dispatchTouchEvent()，然后，
						是事件发生的所有布局的所属直接父View的onInterceptTouchEvent()。如果此方法返回true，则其子View将不再接收到事件，而是此View本身的接收处理此事件。
						然后是，上面讨论到的view类的onTouchEvent()方法。如果此方法返回false，那么事件最后将传递到Activity的onTouchEvent()方法中。
						</li>
					</ul>
			 </li>
			 <li><strong>MVC风格的应用框架:C-应用控制器</strong>
			 	 <button class="more">&nbsp;&nbsp;</button>
					<ul class="details">
						<li><strong>Activity:控制器中心</strong></li>
						<li><strong>Android多任务机制</strong></li>
						<li><strong>Intent及Intent&nbsp;Filter</strong></li>
						<li><strong>Activity:控制器中心</strong></li>
					</ul>
			 </li>
			 
		
			
			</ul>
        </div>
	</section>
	<section class="page">
	    <div class="cta">
		<h2 class="section_name">设计中问题及解决方案</h2>
		<ul>
			<li><strong>&nbsp;基础数据的缓存与数据同步</strong>
			 	
			 </li>
			<li><strong>&nbsp;动态即时数据的缓存与同步</strong>
			 	 <button class="more">&nbsp;&nbsp;</button>
			 	 <p class="details">
			 	 					 在点菜过程中，餐厅中桌子是不停的在动态的变化的。这就要求每次使用应用的服务员打开桌子状态界面的时候，看到的都应该是最新桌子状态。
					 如果两个服务员同时开一张台就会造成冲突的。这就要求每次都要去下载桌子状态数据。但是如果桌子比较多，数据量也就很多。
					 在刷新桌子状态数据的时候容易出现问题。
			 	 </p>
			 </li>
			<li><strong>&nbsp;多线程与Socket通信</strong>
			 	 <button class="more">&nbsp;&nbsp;</button>
			 	 <p class="details">
			 	 						  Socket连接是一个比较重量级的连接。如果每次发送请求交互都重新创建连接，会使网络的性能大打折扣。
					  而且Socket的IO是以阻塞的方式时行的。所以如果只有一个Socket连接的话，在网络请求较多的情况下，网络的性能会进一步下降。
			 	 </p>
			 </li>
			<li><strong>&nbsp;响应性设计与AsyncTask</strong>
			 	 <button class="more">&nbsp;&nbsp;</button>
			 	 <div class="details">
			 	 			<p>
				在Android3之前如果写在UI线程（即主线程）中进行网络操作，如向服务端请求数据。应用运行正常，但是在android3及之后的版本（并且目标SDK版本是android3及之后的版本）则会抛出异常：
				<code>android.os.NetworkOnMainThreadException</code>
				
			    我们知道网络操作是不稳定，并且耗时的。如果在UI线程中进行网络操作，将阻塞UI线程，一般的行为表示就是让用户觉得程序卡在那里了。
			    造成用户体验不好。例如我们要在用户点击的某个图片的缩略图的时候，向服务器请求对应图片的数据，我们也许会这样来将网络操作放在后台线程中。
			</p>
			
			<pre>
public void onThumbClick(View v){
	 final String imgUrl = (String) v.getTag();
	new Thread(new Runnable(){ 
		public void run(){
			Bitmap b = loadImageFromServer(imgUrl);
			mMenuxImage.setImageBitmap(b);
		}
	}).start();
}	
			</pre>
			<p>
			上面的代码看起来很好，但是它违背了Android设计中的另外一条原则就是，不要在UI线程之外访问Android的UI控件。而上面的代码就在
			后台线程中修改了ImageView的一个对象。这会导致未定义的行为，并且可能会消耗大量时间。<sup>[17]</sup>
			但是，有时候我们又需要在后台线程中访问UI组件。正如上面的的代码所做的。幸好Android平台提供了几种在其它线程中访问UI线程中的方法。
			如：1.使用<code>Activity.runOnUiThread(Runnable)</code>，2.使用View类提供的<code>View.post(Runnable)</code>和<code>View.postDelayed(Runnable,long)</code>
			我们使用方法2,将上面的代码修改如下 ：
		 </p>
		<pre>
public void onThumbClick(View v){
	 final String imgUrl = (String) v.getTag();
	new Thread(new Runnable(){ 
		public void run(){
			Bitmap b = loadImageFromServer(imgUrl);
			mMenuxImage.post(new Runnable(){
				public void run(){
				mMenuxImage.setImageBitmap(b);
				}
			});
			
		}
	}).start();
}
		</pre>
		 <p>
		 上面的代码，已经是线程安全的了，但是看起来有一点的难看。如果代码更复杂点，可能就更难看了。
		 在Android的世界里，解决上面的问题的最好方法就是扩展AsyncTask类了。
		 AsyncTask专门有一个方法，可以用来在后台线程执行某些操作，然后将操作结果返回给UI线程中的执行的方法。
		 AsyncTask中主要的方法说明如下：
		 </p>
		 <ul>
		 	<li><code>doInBackground()</code>，AsyncTask类会保证这个方法在一个后台线程中运行。运行结果将传递给onPostExecute()。</li>
		 	<li><code>onPreExecute,onPostExecute(),onProgressUpdate()</code>在UI线程中执行。</li>
		 	<li><code>onProgressUpdate()</code>，在doInBackgroud()中调用publishProgress()则可以在UI线程中调用onProgressUpdate，顾名思义，这个方法用来报告后台线程现在处理到什么进度了。</li>
		 </ul>
		 上面的示例代码使用AsyncTask改写之后，如下：
		<pre>
private class DownloadImageTask extends AsyncTask&lt;String,void,Bitmap&gt;{
	@Override
	protected Bitmap doInBackground(String... urls){
		return loadImageFromServer(urls[0]);
	}
	@Override
	protected void onPostExecute(Bitmap result){
		mMenuxImage.setImageBitmap(result);
	}
}
private void onThumbClick(View v){
	new DownloadImageTask().execute((String)v.getTag());
}
		</pre>
		从上面的代码可以看出使用了AsyncTask之后，代码的可以变得很清晰了。可见AsyncTask()确实是在Android平台进行如网络等后台操作的理想实现模式。
			 	 
			 	 
			 	 </div>
			 </li>
		</ul>
		
	
	</div>
       
	</section>
	
	
	<section class="page">
	        <div class="cta">
		<h1>Refactor Design</h1>
		<ul>
			<li><strong>会说话的代码</strong><span class="more">&nbsp;&nbsp;</span>
				<ul class="details">
					<li><strong >包名会说话 </strong><span class="more">&nbsp;&nbsp;</span>
					   <p class="details">
					   榜样的力量无穷的。好地包名的设计可以参考一些优秀的开源项目。
								最显著，作为android开发者，可以参考Java类库的包名命名，android框架的包的命名。
								好的包名的标准，应该是能够顾名思义，一目了解。首先是应该遵守Java关于包名的规范。			
					   </p>
					</li>
					<li><strong>类名会说话</strong> <span class="more">&nbsp;&nbsp;</span>
					   <div class="details">
					   			类是对现实事件事件是抽象。有时也是对本身是抽象的事件的再抽象。
								所以一般使用名词来表示某一个类。也可以用物以类聚的方法来处理某些
								不具备抽象意义的类，如某一些功能方法集合。完成某些抽象任务的方法集合放在一起。
										<ul>
									<li><strong>实体类</strong>，找对应的英文单词就可以了。对于英文不好的，可以多多比较下英文单词看那个比较适合一些。</li>
									<li><strong>通过继承的类</strong>，通过继承的类，根据自己的需要仿照所继承的类的名字，就可以得到一个合适的名字了。
									如Activity类是，android中开发中控制器的最基本类，集成了ListView功能的类就叫ListActivity。集成Tab效果的类就叫TabActivity。</li>
									<li><strong>通过实现的接口</strong>，如果类只是简单的实现了某个接口。那么可以简单的在接口名后面加过Impl，如有一个PersonDao的接口。那么在只有一个
									实现的时候，其类名可以是PersonDaoImpl。
								</ul>
					   </div>
					</li>
					<li><strong>字段会说话</strong><span class="more">&nbsp;&nbsp;</span>
					   <p class="details">
					   			在面向对象的世界中，字段通常是对象的属性的表示。
								通常是直接写成对应的属性名。同类字段最好是具有某种属性。
								并且以关键特性开头。如有些作为键名的常量就是可以以KEY_作为前缀。
								遵守一般的编程习惯如常量使用全部大写，多个单词以下划线分开。
								对于基于类型的变量，需要选择表现出相关意义的变量名。
								尽量保证完整的意义的名字，不能随便使用简写。对于java开发来讲。
								就算写时候用的名字比较完整。占用类存多一点点，但是在发布应用之前，可以使用
								Java代码混淆工具即代码压缩工具如ProGuard来完成。这个的效果，比自己费改心来想一个简短的名字
								效果好得多。所以字段名，尽量让它表达多自己应该有的意义出来。
					   </p>
					</li>
					<li><strong>方法会说话</strong><span class="more">&nbsp;&nbsp;</span>
					   <div class="details">
					   		比如我们需要在一个绘制图形的方法中计算两点之间的距离。
								  因为<code>d=sqrt((x1-x2)^<sup>2</sup>+(y1-y2)^<sup>2</sup>)</code>
								  所以我们写出的代码是这样的：</p>
								  <pre>
double distance = Math.sqrt(Math.pow((x1-x2),2)+Math.pow((y1-y2),2))；
					 			 </pre>
					 			 After Refactoring...<span class="more">&nbsp;&nbsp;</span>
								<pre class="details">
float distance = distanceOf(x1,y1,x2,y2)；						  
/**
 * 计算两点之间的距离 点1 (startX,startY),点2 (endX,endY)
 */
public static float distanceOf(float startX, float startY, float endX, float endY) {

	float w = Math.abs(startX - endX);
	float h = Math.abs(startY - endY);

	return (float) Math.sqrt(Math.pow(w, 2) + Math.pow(h, 2));
	
}								
								</pre>
					   </div>
					</li>
					<li><strong>变量会说话</strong><span class="more">&nbsp;&nbsp;</span>
					   <p class="details">
						在方法中，变量仿佛是活跃在代码中精灵。
					   </p>
					</li>
				</ul>
			</li>
			<li>Refactoring in Practisce
				<strong>使用提取方法重构改善代码结构设计</strong>
			</li>
			<li><strong>Performance</strong>
				<h3>更有效的代码</h3>
				<h3>更有效的UI</h3>
			</li>
		</ul>
	</div>
        
        
	</section>
	<section class="page" style="margin-bottom:10em;">    
		<h1>Thank you</h1>
	</section>

</body>
</html>
